package es.gesfutbol.web;

import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.propertyeditors.CustomCollectionEditor;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import es.gesfutbol.dao.IEquipDao;
import es.gesfutbol.dao.IEstadiDao;
import es.gesfutbol.domini.implementacio.Equip;
import es.gesfutbol.domini.implementacio.Estadi;

public class EquipoController extends MultiActionController {

	private IEquipDao equipDao;

	private IEstadiDao estadiDao;

	public IEquipDao getEquipDao() {
		return equipDao;
	}

	public void setEquipDao(IEquipDao equipDAO) {
		this.equipDao = equipDAO;
	}

	public IEstadiDao getEstadiDao() {
		return estadiDao;
	}

	public void setEstadiDao(IEstadiDao estadiDao) {
		this.estadiDao = estadiDao;
	}

	/**
	 * Mètode que inicialitza la pàgina d'equips i envia la llista
	 * d'equips actuals a la vista.
	 * 
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	public ModelAndView init(HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		List<Equip> equips = equipDao.findAll();

		ModelMap modelMap = new ModelMap();
		modelMap.addAttribute("llistatEquips", equips);
		return new ModelAndView("administracion/equipos", modelMap);
	}

	@Override
	protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) {

		binder.registerCustomEditor(Set.class, "estadiAlternatiu", 
				new CustomCollectionEditor(Set.class){

			@Override
			protected Object convertElement(Object element){
				Long estadiId = Long.parseLong((String)element);
				Estadi estadi = new Estadi();
				estadi.setIdEstadi(estadiId);
				return estadi;
			}
		});	       
	}	

	/**
	 * Mètode que inicialitza la vista d'afegir equip.
	 * 
	 * @param request
	 * @param response
	 * @return
	 */
	public ModelAndView viewAdd(HttpServletRequest request,
			HttpServletResponse response){

		//Fem la cerca dels estadis.
		List<Estadi> estadis = estadiDao.findAll();

		ModelMap model = new ModelMap();
		Equip nouEquip = new Equip();
		nouEquip.setEstadi(new Estadi());
		model.put("llistaEstadis", estadis);
		model.put("equip", nouEquip);
		return new ModelAndView("administracion/formEquipos", model);
	}

	/**
	 * Mètode que obté de la request l'equipId a modificar, el cerca
	 * i retorna els valors al formulari d'equips.
	 * 
	 * @param request
	 * @param response
	 * @return
	 */
	public ModelAndView viewUpdate(HttpServletRequest request,
			HttpServletResponse response){

		//Fem la cerca dels estadis.
		List<Estadi> estadis = estadiDao.findAll();

		Long idEquip = Long.parseLong(request.getParameter("equipoId"));
		Equip equip = equipDao.findById(idEquip);
		equip = equipDao.deproxy(equip);

		ModelMap model = new ModelMap();
		model.put("llistaEstadis", estadis);
		model.put("equip", equip);
		return new ModelAndView("administracion/formEquipos", model);
	}

	/**
	 * Mètode que guarda els canvis tant de l'afegir com l'editar
	 * equip.
	 * 
	 * @param request
	 * @param response
	 * @param equip
	 * @return
	 */
	public ModelAndView addOrUpdate(HttpServletRequest request,
			HttpServletResponse response, Equip equip){
		equipDao.save(equip);
		return new ModelAndView("redirect:init.htm");
	}	
}
